package com.liuqing.www.java基础知识.网络通信;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**\n\t支持 换行与退格
 * 注意选择端口应大于1024(系统占用),可以有65536（0-65535）（即：2^16）个之多
 * 长连接，连接不关闭，输入、输出流野不关闭，一直运行但可以阻塞，一般通过传入固定字符来确定新的读取或输入开始
 * @author 韩世超
 *1.客户端发送心跳信息你只需接收下吧，那个心跳信息用个特殊标识就行啊
2.至于防止通信中丢包现象，udp的话，应该用stop-and-wait方法去做，即先将要发的包排好序，然后先发一批出去，等待响应，收到后再发一批，至于响应，我觉得客户端返回一个标识即可，而tcp的话，实在不明白为什么要防止丢包，要出现丢包，那是网络问题，是物理层或者网关的问题了，你程序不必关心和解决吧。
3.防阻塞的话用nio吧
4.建议用mina2
主线程不停的accept，得到的话分配新线程去处理流读取
这样的确定容易阻塞。阻塞后线程占着，浪费资源，遇到攻击服务器瞬间毙命
 */
public class TCP信息传输1 {
	public static void main(String[] args) {
		server s=new server();
		s.start();
		client c=new client();
		c.start();
	}
	
}
/**ServerSocket() 
ServerSocket(int port)  
ServerSocket(int port, int backlog) 
ServerSocket(int port, int backlog, InetAddress bindAddr) 
使用指定的端口、排队数目 和要绑定到的本地 IP 地址创建服务器。 
*/
class server extends Thread{
	ServerSocket ss=null;
	Socket so=null;
	InputStream in=null;
	OutputStream out=null;
	public server() {
		try {
			ss=new ServerSocket(8000,3);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("实例化成功");
	}
	public void run(){
		int i=0;
		try {
			 so=ss.accept();
			 in=so.getInputStream();
//			 StringBuffer sBuffer = new StringBuffer();
			 BufferedReader br =new BufferedReader(new InputStreamReader(in));
			while(true){
			try {
				System.out.println("正在监听");
				i++;
				System.out.println("接收到第"+i+"客户端");
				
//				int str=-1;
				String str=null;
//				char[] buf = new char[10];
				System.out.println("开始");
//				while((str=br.read())!=-1){//不能用readline他会一直等待换行符
//					char c=(char)str;
//					System.out.print(c);
//					if(c=='a'){
//						System.out.println();
//						System.out.println("结束");
//						break;
//					}
//				}
				while((str=br.readLine())!=null){//不能用readline他会一直等待换行符
					System.out.println(str);
					break;
				
				}
				System.out.println("结束");
//				System.out.println();
//				in.close();
//				br.close();
				Thread.sleep(2000);
			}catch(Exception e){
				e.printStackTrace();
//				continue;
			}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
class client extends Thread{
	public void run(){
		try {
				Socket s=new Socket("127.0.0.1",8000);
				OutputStream out=s.getOutputStream();
				s.setKeepAlive(true);
				while(true){
					try {
						if(out==null){
							out=s.getOutputStream();
						}
					DataOutputStream dot=new DataOutputStream(out);
					dot.writeUTF("&&&&&&&a\n");
					dot.flush();
					out.flush();
//					out.close();
//					dot.close();
					Thread.sleep(2000);
					}catch(Exception e){
						e.printStackTrace();
					break;
					}
				}
				
//				dot.close();//必须关闭，不然客户端会报异常
//			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}